java  기초 지식의 IO 총화

15593 단어 자바IO
java  기초 지식의 IO 총화
     나 는 다음 몇 편의 글 에서 자바 를 빠르게 돌 이 켜 볼 계획 이다.주로 기본 적 인 JDK 와 관련 된 내용 이다.
작업 후 사용 하 는 기술 은 프로젝트 의 변화 에 따라 변화 한다.때로는 C\#,때로는 자바,물론 다른 자질구레한 기술 도 있다.전체적으로 보면 C\#의 사용 시간 이 더 길 고 그 다음은 자바 이다.나 자신 은 언어 에 경향성 이 없고 일 할 수 있 는 언어 가 좋 은 언어 다.그리고 대상 을 대상 으로 하 는 측면 에서 볼 때 C\#와 자바 는 저 에 게 다 를 것 이 없다 고 생각 합 니 다.
이 글 은 주로 자바 와 I/O 작업 과 관련 된 내용 을 되 돌아 본다.I/O 도 프로 그래 밍 언어의 기본 적 인 특성 이다.자바 의 I/O 는 두 가지 유형 으로 나 뉘 는데 하 나 는 순서대로 읽 는 것 이 고 하 나 는 무 작위 로 읽 는 것 이다.
우 리 는 먼저 순 서 를 보고 읽 을 수 있 습 니 다.두 가지 방식 으로 순서대로 읽 을 수 있 습 니 다.하 나 는 InputStream/OutputStream 입 니 다.이것 은 바이트 에 대한 입 출력 흐름 입 니 다.다른 하 나 는 Reader/Writer 입 니 다.문 자 를 위 한 입 출력 흐름 입 니 다.
다음은 인 스타 그램 의 구 조 를 그 려 보도 록 하 겠 습 니 다.
  
  • FileInputStream:파일 을 조작 하고 BufferedInputStream 과 함께 자주 사용 합 니 다
  • PipedInputStream:스 레 드 간 통신 에 사용 할 수 있 습 니 다
  • ObjectInputStream:대상 의 직렬 화 에 사용 할 수 있 습 니 다
  • ByteArray InputStream:바이트 배열 의 입력 을 처리 하 는 데 사 용 됩 니 다
  • LineNumberInputStream:현재 줄 수 를 출력 할 수 있 고 프로그램 에서 수정 할 수 있 습 니 다.
  • 다음은 OutputStream 의 구조 입 니 다.
      
    PrintStream:print 와 println 과 같은 인 터 페 이 스 를 제공 하여 데 이 터 를 출력 합 니 다.
    입 출력 을 어떻게 스 트림 으로 조작 하 는 지 살 펴 보 겠 습 니 다.
    InputStream 으로 파일 읽 기
    
      FileInputStream      
    public static byte[] readFileByFileInputStream(File file) throws IOException
    {
      ByteArrayOutputStream output = new ByteArrayOutputStream();
      FileInputStream fis = null;
      try
      {
        fis = new FileInputStream(file);
        byte[] buffer = new byte[1024];
        int bytesRead = 0;
        while((bytesRead = fis.read(buffer, 0, buffer.length)) != -1)
        {
          output.write(buffer, 0, bytesRead);
        }
      }
      catch(Exception ex)
      {
        System.out.println("Error occurs during reading " + file.getAbsoluteFile());
      }
      finally
      {
        if (fis !=null) fis.close();
        if (output !=null) output.close();
      }
      return output.toByteArray();
    }
    
      BufferedInputStream    
    public static byte[] readFileByBufferedInputStream(File file) throws Exception
    {
      FileInputStream fis = null;
      BufferedInputStream bis = null;
      ByteArrayOutputStream output = new ByteArrayOutputStream();
      try
      {
        fis = new FileInputStream(file);
        bis = new BufferedInputStream(fis);
        byte[] buffer = new byte[1024];
        int bytesRead = 0;
        while((bytesRead = bis.read(buffer, 0, buffer.length)) != -1)
        {
          output.write(buffer, 0, bytesRead);
        }
      }
      catch(Exception ex)
      {
        System.out.println("Error occurs during reading " + file.getAbsoluteFile());
      }
      finally
      {
        if (fis != null) fis.close();
        if (bis != null) bis.close();
        if (output != null) output.close();
      }
      return output.toByteArray();
    }
    OutputStream 으로 파일 복사 하기
    
      FileOutputStream    
    public static void copyFileByFileOutputStream(File file) throws IOException
    {
      FileInputStream fis = null;
      FileOutputStream fos = null;
      try
      {
        fis = new FileInputStream(file);
        fos = new FileOutputStream(file.getName() + ".bak");
        byte[] buffer = new byte[1024];
        int bytesRead = 0;
        while((bytesRead = fis.read(buffer,0,buffer.length)) != -1)
        {
          fos.write(buffer, 0, bytesRead);
        }
        fos.flush();
      }
      catch(Exception ex)
      {
        System.out.println("Error occurs during copying " + file.getAbsoluteFile());
      }
      finally
      {
        if (fis != null) fis.close();
        if (fos != null) fos.close();
      }
    }
    
      BufferedOutputStream    
    public static void copyFilebyBufferedOutputStream(File file)throws IOException
    {
      FileInputStream fis = null;
      BufferedInputStream bis = null;
      FileOutputStream fos = null;
      BufferedOutputStream bos = null;
      try
      {
        fis = new FileInputStream(file);
        bis = new BufferedInputStream(fis);
        fos = new FileOutputStream(file.getName() + ".bak");
        bos = new BufferedOutputStream(fos);
        byte[] buffer = new byte[1024];
        int bytesRead = 0;
        while((bytesRead = bis.read(buffer, 0, buffer.length)) != -1)
        {
          bos.write(buffer, 0, bytesRead);
        }
        bos.flush();
      }
      catch(Exception ex)
      {
        System.out.println("Error occurs during copying " + file.getAbsoluteFile());
      }
      finally
      {
        if (fis != null) fis.close();
        if (bis != null) bis.close();
        if (fos != null) fos.close();
        if (bos != null) bos.close();
      }
    }
    이곳 의 코드 는 이상 에 대한 처리 가 매우 불완전 합 니 다.잠시 후에 우 리 는 완전 하고 엄밀 한 코드 를 제시 할 것 입 니 다.
    다음은 리더 의 구 조 를 살 펴 보 겠 습 니 다.
      
    이곳 의 Reader 는 기본적으로 InputStream 과 대응 할 수 있다.  
    Writer 의 구 조 는 다음 과 같다.
      
    Reader 나 Writer 를 사용 하 는 예 를 살 펴 보 겠 습 니 다.
    Reader 로 파일 내용 읽 기
    
      BufferedReader      
    public static String readFile(String file)throws IOException
    {
      BufferedReader br = null;
      StringBuffer sb = new StringBuffer();
      try
      {
        br = new BufferedReader(new FileReader(file));
        String line = null;
        
        while((line = br.readLine()) != null)
        {
          sb.append(line);
        }
      }
      catch(Exception ex)
      {
        System.out.println("Error occurs during reading " + file);
      }
      finally
      {
        if (br != null) br.close();
      }
      return sb.toString();
    }
    Writer 로 파일 복사 하기
    
      BufferedWriter    
    public static void copyFile(String file) throws IOException
    { 
      BufferedReader br = null;
      BufferedWriter bw = null;
      try
      {
        br = new BufferedReader(new FileReader(file));
        bw = new BufferedWriter(new FileWriter(file + ".bak"));
        String line = null;
        while((line = br.readLine())!= null)
        {
          bw.write(line);
        }
      }
      catch(Exception ex)
      {
        System.out.println("Error occurs during copying " + file);
      }
      finally
      {
        if (br != null) br.close();
        if (bw != null) bw.close();
      }
    }
    다음은 파일 에 무 작위 로 접근 하 는 방법 을 살 펴 보 겠 습 니 다.자바 에 서 는 주로 RandomAccessFile 을 사용 하여 파일 을 무 작위 로 조작 합 니 다.
    크기 가 고정된 파일 만 들 기
    
             
    public static void createFile(String file, int size) throws IOException
    {
      File temp = new File(file);
      RandomAccessFile raf = new RandomAccessFile(temp, "rw");
      raf.setLength(size);
      raf.close();
    }
    파일 에 데 이 터 를 무 작위 로 기록 합 니 다.
    
              
    public static void writeFile(String file, byte[] content, int startPos, int contentLength) throws IOException
    {
      RandomAccessFile raf = new RandomAccessFile(new File(file), "rw");
      raf.seek(startPos);
      raf.write(content, 0, contentLength);
      raf.close();
    }
    이어서 우 리 는 다른 상용 조작 들 을 보 았 다.
    파일 이동
    
        
    public static boolean moveFile(String sourceFile, String destFile)
    {
      File source = new File(sourceFile);
      if (!source.exists()) throw new RuntimeException("source file does not exist.");
      File dest = new File(destFile);
      if (!(new File(dest.getPath()).exists())) new File(dest.getParent()).mkdirs();
      return source.renameTo(dest);
    }
    파일 복사
    
        
    public static void copyFile(String sourceFile, String destFile) throws IOException
    {
      File source = new File(sourceFile);
      if (!source.exists()) throw new RuntimeException("File does not exist.");
      if (!source.isFile()) throw new RuntimeException("It is not file.");
      if (!source.canRead()) throw new RuntimeException("File cound not be read.");
      File dest = new File(destFile);
      if (dest.exists())
      {
        if (dest.isDirectory()) throw new RuntimeException("Destination is a folder.");
        else
        {
          dest.delete();
        }
      }
      else
      {
        File parentFolder = new File(dest.getParent());
        if (!parentFolder.exists()) parentFolder.mkdirs();
        if (!parentFolder.canWrite()) throw new RuntimeException("Destination can not be written.");
      }
      FileInputStream fis = null;
      FileOutputStream fos = null;
      try
      {
        fis = new FileInputStream(source);
        fos = new FileOutputStream(dest);
        byte[] buffer = new byte[1024];
        int bytesRead = 0;
        while((bytesRead = fis.read(buffer, 0, buffer.length)) != -1)
        {
          fos.write(buffer, 0, bytesRead);
        }
        fos.flush();
      }
      catch(IOException ex)
      {
        System.out.println("Error occurs during copying " + sourceFile);
      }
      finally
      {
        if (fis != null) fis.close();
        if (fos != null) fos.close();
      }
    }
    폴 더 복사
    
         
    public static void copyDir(String sourceDir, String destDir) throws IOException
    {
      
      File source = new File(sourceDir);
      if (!source.exists()) throw new RuntimeException("Source does not exist.");
      if (!source.canRead()) throw new RuntimeException("Source could not be read.");
      File dest = new File(destDir);
      if (!dest.exists()) dest.mkdirs();
      
      File[] arrFiles = source.listFiles();
      for(int i = 0; i < arrFiles.length; i++)
      {
        if (arrFiles[i].isFile())
        {
          BufferedReader reader = new BufferedReader(new FileReader(arrFiles[i]));
          BufferedWriter writer = new BufferedWriter(new FileWriter(destDir + "/" + arrFiles[i].getName()));
          String line = null;
          while((line = reader.readLine()) != null) writer.write(line);
          writer.flush();
          reader.close();
          writer.close();
        }
        else
        {
          copyDir(sourceDir + "/" + arrFiles[i].getName(), destDir + "/" + arrFiles[i].getName());
        }
      }
    }
    폴 더 삭제
    
         
    public static void del(String filePath)
    {
      File file = new File(filePath);
      if (file == null || !file.exists()) return;
      if (file.isFile())
      {
        file.delete();
      }
      else
      {
        File[] arrFiles = file.listFiles();
        if (arrFiles.length > 0)
        {
          for(int i = 0; i < arrFiles.length; i++)
          {
            del(arrFiles[i].getAbsolutePath());
          }
        }
        file.delete();
      }
    }
    폴 더 크기 가 져 오기
    
           
    public static long getFolderSize(String dir)
    {
      long size = 0;
      File file = new File(dir);
      if (!file.exists()) throw new RuntimeException("dir does not exist.");
      if (file.isFile()) return file.length();
      else
      {
        String[] arrFileName = file.list();
        for (int i = 0; i < arrFileName.length; i++)
        {
          size += getFolderSize(dir + "/" + arrFileName[i]);
        }
      }
      
      return size;
    }
    큰 파일 을 여러 개의 작은 파일 로 나누다.
    
                
    public static void splitFile(String filePath, long unit) throws IOException
    {
      File file = new File(filePath);
      if (!file.exists()) throw new RuntimeException("file does not exist.");
      long size = file.length();
      if (unit >= size) return;
      int count = size % unit == 0 ? (int)(size/unit) : (int)(size/unit) + 1;
      String newFile = null;
      FileOutputStream fos = null;
      FileInputStream fis =null;
      byte[] buffer = new byte[(int)unit];
      fis = new FileInputStream(file);
      long startPos = 0;
      String countFile = filePath + "_Count";
      PrintWriter writer = new PrintWriter(new FileWriter( new File(countFile)));
      writer.println(filePath + "\t" + size);
      for (int i = 1; i <= count; i++)
      {
        newFile = filePath + "_" + i;
        startPos = (i - 1) * unit;
        System.out.println("Creating " + newFile);
        fos = new FileOutputStream(new File(newFile));
        int bytesRead = fis.read(buffer, 0, buffer.length);
        if (bytesRead != -1)
        {
          fos.write(buffer, 0, bytesRead);
          writer.println(newFile + "\t" + startPos + "\t" + bytesRead);
        }
        fos.flush();
        fos.close();
        System.out.println("StartPos:" + i*unit + "; EndPos:" + (i*unit + bytesRead));
      }
      writer.flush();
      writer.close();
      fis.close();
    }
    여러 개의 작은 파일 을 큰 파일 로 통합 합 니 다.
    
                  
    public static void linkFiles(String countFile) throws IOException
    {
      File file = new File(countFile);
      if (!file.exists()) throw new RuntimeException("Count file does not exist.");
      BufferedReader reader = new BufferedReader(new FileReader(file));
      String line = reader.readLine();
      String newFile = line.split("\t")[0];
      long size = Long.parseLong(line.split("\t")[1]);
      RandomAccessFile raf = new RandomAccessFile(newFile, "rw");
      raf.setLength(size);
      FileInputStream fis = null;
      byte[] buffer = null;
      
      while((line = reader.readLine()) != null)
      {
        String[] arrInfo = line.split("\t");
        fis = new FileInputStream(new File(arrInfo[0]));
        buffer = new byte[Integer.parseInt(arrInfo[2])];
        long startPos = Long.parseLong(arrInfo[1]);
        fis.read(buffer, 0, Integer.parseInt(arrInfo[2]));
        raf.seek(startPos);
        raf.write(buffer, 0, Integer.parseInt(arrInfo[2]));
        fis.close();
      }
      raf.close();
    }
    외부 명령 실행
    
          
    public static void execExternalCommand(String command, String argument)
    {
      Process process = null;
      try
      {
        process = Runtime.getRuntime().exec(command + " " + argument);
        InputStream is = process.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String line = null;
        while((line = br.readLine()) != null)
        {
          System.out.println(line);
        }
      }
      catch(Exception ex)
      {
        System.err.println(ex.getMessage());
      }
      finally
      {
        if (process != null) process.destroy();
      }
    }
    읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기